<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>发现 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'modules-discovery-hosts-providers.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/modules-discovery-hosts-providers.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/modules-discovery-hosts-providers.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/modules-discovery-hosts-providers.html" rel="nofollow" target="_blank">../en/modules-discovery-hosts-providers.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="setup.html">安装和设置</a></span>
»
<span class="breadcrumb-link"><a href="modules-discovery.html">发现和集群形成</a></span>
»
<span class="breadcrumb-node">发现</span>
</div>
<div class="navheader">
<span class="prev">
<a href="modules-discovery.html">« 发现和集群形成</a>
</span>
<span class="next">
<a href="modules-discovery-quorums.html">基于法定人数的选举机制 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="modules-discovery-hosts-providers"></a>发现 (Discovery)
</h2>
</div></div></div>
<p>
发现是集群形成模块找到要与之形成集群的其他节点的过程。

当你启动一个 Elasticsearch 节点时，或者当一个节点认为主节点出现故障时，这个过程就会运行，并继续运行直到找到主节点或选出新的主节点。
</p>
<p>
该过程从来自一个或多个 <a class="xref" href="modules-discovery-hosts-providers.html#built-in-hosts-providers" title="Seed hosts providers">种子主机提供者(seed hosts providers)</a> 的<em>种子(seed)</em>地址列表开始，以及在最后已知的集群中的任何符合主节点条件的节点的地址。
</p>
<p>
该过程分两个阶段进行：
</p>
<p>
首先，每个节点通过连接到每个地址来探测种子地址，并试图识别它所连接的节点，并验证它是否是符合主节点条件的节点。
</p>
<p>
其次，如果成功，它与远程节点共享其所有已知的符合主节点条件的对等节点的列表，远程节点依次与<em>其</em>对等节点进行响应。

然后，该节点探测它刚刚发现的所有新节点，请求它们的对等节点，等等。
</p>
<p>
如果该节点不符合主节点条件，则它继续这个发现过程，直到它发现了一个选举出的主节点。
如果没有发现选举出的主节点，则节点将在 <code class="literal">discovery.find_peers_interval</code> 后重试，其默认值为 <code class="literal">1s</code>。
</p>
<p>
如果该节点符合主节点条件，那么它继续这个发现过程，直到它发现了一个被选举的主节点，或者它发现了足够多的无主的但符合主节点条件的节点来完成一个选择。

如果这两种情况都发生得不够快，那么节点将在 <code class="literal">discovery.find_peers_interval</code> 后重试，其默认值 <code class="literal">1s</code>。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="built-in-hosts-providers"></a>种子主机提供程序(seed hosts providers)
</h3>
</div></div></div>
<p>
默认情况下，集群形成模块提供了两个种子主机提供程序来配置种子节点列表：基于 <em>设置(settings)</em> 的种子主机提供程序和基于<em>文件(file)</em>的种子主机提供程序。

它可以通过 <a href="https://www.elastic.co/guide/en/elasticsearch/plugins/7.7/discovery.html" class="ulink" target="_top">发现插件(discovery plugins)</a> 扩展到支持云环境和其他形式的种子主机提供程序。

种子主机提供程序是使用 <code class="literal">discovery.seed_providers</code> 设置配置的，该设置默认为基于<em>设置(settings)</em>的主机提供程序。

此设置接受不同提供程序的列表，允许你利用多种方法来查找集群的种子主机。
</p>
<p>
每个种子主机提供程序都产生种子节点的 IP 地址或主机名。

如果它返回的是任意的主机名，则使用 DNS 查找将这些主机名解析为 IP 地址。

如果一个主机名解析为多个 IP 地址，那么 Elasticsearch 会尝试在所有这些地址上找到一个种子节点。

如果主机提供程序到那时还没有显式给出节点的 TCP 端口，它将隐式地使用 <code class="literal">transport.profiles.default.port</code>或 <code class="literal">transport.port</code> (如果未设置<code class="literal">transport.profiles.default.port</code>) 给出的端口范围中的第一个端口。

并发查找的数量由 <code class="literal">discovery.seed_resolver.max_concurrent_resolvers</code>控制（默认值为 <code class="literal">10</code>），每次查找的超时时间由 <code class="literal">discovery.seed_resolver.timeout</code>控制（默认值为 <code class="literal">5s</code>）。

请注意，DNS 查找受制于 <a class="xref" href="networkaddress-cache-ttl.html" title="DNS cache settings">JVM DNS缓存</a>。
</p>
<h5>
<a id="settings-based-hosts-provider"></a>基于设置的主机提供程序
</h5>
<p>
基于设置的种子主机提供程序使用节点设置来配置种子节点地址的静态列表。
这些地址可以是主机名或 IP 地址；在每一轮发现过程中，指定为主机名的主机被解析为 IP 地址。
</p>
<p>
使用 <a class="xref" href="discovery-settings.html#unicast.hosts" title="discovery.seed_hosts"><code class="literal">discovery.seed_hosts</code></a> 静态设置来设置主机列表。例如：
</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 <a id="CO29-1"></a><i class="conum" data-value="1"></i>
   - seeds.mydomain.com <a id="CO29-2"></a><i class="conum" data-value="2"></i></pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO29-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
端口默认为 <code class="literal">transport.profiles.default.port</code>；如果未指定，则回退到 <code class="literal">transport.port</code>。
</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO29-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>
如果主机名解析为多个 IP 地址，Elasticsearch 将尝试连接到每个解析的地址。
</p>
</td>
</tr>
</table>
</div>
<h5>
<a id="file-based-hosts-provider"></a>基于文件的种子主机提供程序
</h5>
<p>
基于文件的种子主机提供程序通过一个外部文件配置主机列表。
Elasticsearch 会在文件发生变化时重新加载这个文件，这样种子节点的列表就可以动态变化，而不需要重新启动每个节点。

例如，这为在 Docker 容器中运行的 Elasticsearch 实例提供了一种方便的机制，当在节点启动但可能不知道 IP 地址时，可以动态地向该实例提供要连接的 IP 地址列表。
</p>
<p>
要启用基于文件的发现，请在 <code class="literal">elasticsearch.yml</code> 文件中配置<code class="literal">文件(file)</code> 主机提供程序，如下所示：
</p>
<div class="pre_wrapper lang-yml">
<pre class="programlisting prettyprint lang-yml">discovery.seed_providers: file</pre>
</div>
<p>
然后，在 <code class="literal">$ES_PATH_CONF/unicast_hosts.txt</code> 下创建一个文件，格式如下。
无论何时对 <code class="literal">unicast_hosts.txt</code> 文件进行更改，Elasticsearch 都会获取新的更改，并使用新的主机列表。
</p>
<p>
请注意，基于文件的发现插件扩充了 <code class="literal">elasticsearch.yml</code> 中的单播主机列表：
如果 <code class="literal">discovery.seed_hosts</code> 中有有效的种子地址，那么除了 <code class="literal">unicast_hosts.txt</code> 中提供的地址之外，Elasticsearch 还会使用这些地址。
</p>
<p>
<code class="literal">unicast_hosts.txt</code> 文件每行包含一个节点记录。
每个节点记录由主机(主机名或 IP 地址)和可选的传输端口号组成。
如果指定了端口号，则必须紧跟在主机之后(在同一行上)，由一个 <code class="literal">:</code> 分隔。

如果未指定端口号，Elasticsearch 将隐式使用 <code class="literal">transport.profiles.default.port</code> 或 <code class="literal">transport.port</code>（如果未设置 <code class="literal">transport.profiles.default.port</code>）给出的端口范围中的第一个端口。
</p>
<p>
例如，这是一个包含四个参与发现的节点的集群的 <code class="literal">unicast_hosts.txt</code> 示例，其中一些节点没有在默认端口上运行：
</p>
<div class="pre_wrapper lang-txt">
<pre class="programlisting prettyprint lang-txt">10.10.10.5
10.10.10.6:9305
10.10.10.5:10005
# an IPv6 address
[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:9301</pre>
</div>
<p>
如上所述，允许用主机名代替 IP 地址，并由 DNS 解析。
IPv6 地址必须用括号括起来，如果需要，在括号后面加上端口。
</p>
<p>
还可以向该文件添加注释。
所有注释必须出现在以 <code class="literal">#</code> 开头的行中(也就是说，注释不能从行中间开始，必须占整行)。
</p>
<h5>
<a id="ec2-hosts-provider"></a>EC2 主机提供程序
</h5>
<p>
<a href="https://www.elastic.co/guide/en/elasticsearch/plugins/7.7/discovery-ec2.html" class="ulink" target="_top">EC2 发现插件</a> 添加了一个主机提供程序，它使用 <a href="https://github.com/aws/aws-sdk-java" class="ulink" target="_top">AWS API</a> 来查找种子节点列表。
</p>
<h5>
<a id="azure-classic-hosts-provider"></a>Azure Classic 主机提供程序
</h5>
<p>
<a href="https://www.elastic.co/guide/en/elasticsearch/plugins/7.7/discovery-azure-classic.html" class="ulink" target="_top">Azure Classic 发现插件</a> 添加了一个主机提供程序，它使用 Azure Classic API 来查找种子节点列表。
</p>
<h5>
<a id="gce-hosts-provider"></a>Google Compute Engine 主机提供程序
</h5>
<p>
<a href="https://www.elastic.co/guide/en/elasticsearch/plugins/7.7/discovery-gce.html" class="ulink" target="_top">GCE discovery plugin</a> 添加了一个主机提供程序，它使用 GCE API 来查找种子节点列表。
</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="modules-discovery.html">« 发现和集群形成</a>
</span>
<span class="next">
<a href="modules-discovery-quorums.html">基于法定人数的选举机制 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>